import random

import redis
from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from django_redis import get_redis_connection

from utils.rong_lian_yun.sms import SMSService



import logging

logger = logging.getLogger('django')


# Create your views here.
class SMS(APIView):
    # 视图方法现在会接收mobile参数，这个参数已经通过了正则表达式的验证，确保是一个有效的中国手机号格式
    def get(self, request, mobile):
        """
        1.生成验证码
        2.创建Redis链接对象
        3.把验证码存储在Redis
        4.发送验证码
        5.
        :param request:
        :return:
        """
        verification_code = ''.join(random.choices('0123456789', k=4))
        logger.info('verification_code: {}'.format(verification_code))
        SMSService.send_code(tid=1, mobile=mobile, code=verification_code)

        # 创建Redis连接
        # 3. 创建 Redis 连接
        try:
            redis_conn = get_redis_connection('verify_codes')
            # 4. 检查是否频繁请求验证码
            # if redis_conn.get(f'send_flag_{mobile}'):
            #     return Response({"message": "请求过于频繁，请稍后再试"}, status=429)

            # 5. 把验证码存储在 Redis
            # 存储验证码
            redis_conn.setex(f'sms_{mobile}', 300, verification_code)
            # 设置发送标记，防止频繁请求
            # redis_conn.setex(f'send_flag_{mobile}', 60, 1)

            # 6. 发送验证码
            try:
                result = SMSService.send_code(tid=1, mobile=mobile, code=verification_code)
                print("result", result)
                if result.get('statusCode') != '000000':
                    logger.error(f"短信发送失败，手机号: {mobile}, 错误信息: {result}")
                    return Response({"message": "短信发送失败，请稍后再试"}, status=500)
            except Exception as e:
                logger.error(f"短信发送异常，手机号: {mobile}, 异常信息: {e}")
                return Response({"message": "短信发送异常，请稍后再试"}, status=500)

        except Exception as e:
            logger.error(f"Redis 操作异常，手机号: {mobile}, 异常信息: {e}")
            # 返回的 Response 对象会根据配置的渲染器来自动将响应数据渲染为合适的格式（如 JSON、XML 等），并设置正确的 Content-Type 等响应头信息
            return Response({"message": "服务器内部错误，请稍后再试"}, status=500)

        # 7. 返回响应
        return Response({"message": "ok"})
